简介
- MyBatis环境搭建 的方式在前面已经详细的介绍过了,本文将通过映射配置文件,使用代理持久层实现类的方式,来进行MySQL数据库的CRUD操作。
- 环境搭建成功后,MySQL数据库的CRUD操作基于以下几个文件的基础上进行修改:
- UserDao.java(持久层接口)
- 添加CRUD操作的抽象方法。
- UserDao.xml(持久层接口的映射配置文件)
- 添加持久层接口的全类名:namespace
- 添加CRUD操作的mapper子标签:select、update、insert、
- 添加方法名:id
- 添加返回值类型的全类名:resultType
- UserDao.java(持久层接口)
环境搭建
Maven项目依赖
- 在pom.xml 文件中,并不引入MyBatis框架的依赖:
- mybatis(MyBatis框架)
- mysql-connector-java(数据库连接)
- junit (单元测试)
1 |
|
数据库表
1 | #创建数据库 |
目录结构
- src/main
- java
- cn/water/dao
- UserDao.java(持久层接口)
- cn/water/domain
- User.java(实体层)
- resources
- cn/water/dao
- UserDao.xml(映射配置文件)
- cn/water/dao
- SqlMapConfig.xml(MyBatis主配置文件)
- cn/water/dao
- java
- src/tese
- java
- cn/water/test
- MybatisTest.java(测试文件)
- cn/water/test
- java
实体类
User.java
1 | package cn.water.domain; |
持久层接口
UserDao.java
1 | package cn.water.dao; |
映射配置文件
UserDao.xml
1 |
|
测试类
Test.java
1 | package cn.water.test; |
实现CRUD操作
- 在前一篇博客里,我们学习了自定义MyBatis框架,当时我们使用了 Proxy类 和 MapperProxy类 实现了动态代理,并调用了 selectList方法 帮我去执行具体的SQL语句。尽管这并不是完全具体的MyBatis框架底层运作方式,但以目前的知识来讲就足够了。
- 所以当我们使用代理持久层实现类的方式时,代理对象会帮我去调用 selectList方法;但是当我们使用手动编写持久层实现类的方式时,我们就需要自己去调用 selectList方法了。但关于这方面的事情,我不准备在下面讲,这是下一篇博客的事情了。
- 本篇博客在实现CRUD操作的章节,主要用于描述 持久层接口和映射配置文件。
思维导图
![](3.ProxyDao CRUD操作/MyBatisCRUD操作.png)
添加用户
- 持久层接口
1 | void add(User user); |
- 映射配置文件
1 | <select id="add" parameterType="cn.water.domain.User" > |
更新用户
- 持久层接口
1 | void update(User user); |
- 映射配置文件
1 | <select id="update" parameterType="cn.water.domain.User"> |
删除用户
- 持久层接口
1 | void delete(Integer id); |
- 映射配置文件
1 | <select id="delete" parameterType="INT" > |
查找所有用户
- 持久层接口
1 | User findOne(Integer id); |
- 映射配置文件
1 | <select id="findAll" resultType="cn.water.domain.User"> |
查询单个用户
- 持久层接口
1 | List<User> findAll(); |
- 映射配置文件
1 | <select id="findOne" parameterType="INT" resultType="cn.water.domain.User"> |
根据姓名模糊查询
- 持久层接口
1 | List<User> findByName01(String name); |
- 映射配置文件
1 | <select id="findByName01" parameterType="java.lang.String" resultType="cn.water.domain.User"> |
查询所有用户数量
- 持久层接口
1 | Integer findTotal(); |
- 映射配置文件
1 | <select id="findTotal" resultType="INT" > |
添加用户返回ID
- 持久层接口
1 | <insert id="addReturnID" parameterType="cn.water.domain.User"> |
- 映射配置文件
1 | for(User user : dao.findByQueryVO(new QueryVo(new User(100, "ADD RETURN", new Date(), "男", "UserDao")))){ |
【OGNL表达式】
- Object Graphic Navigation Language:对象图导航语言
- 获取数据的一种表达式,在形式上省略了get
- Java表达式:user.getUsername();
- OGNL表达式:user.username
- MyBatis表达式:username
- 获取数据的一种表达式,在形式上省略了get
- 其实在MyBatis的映射配置文件中,我们使用的也是OGNL表达式。只是由于我们再 parameterType属性中已经提供了实体类,所以我们可以省略实体类名直接使用属性名来获取数据。
【POJO对象】
- POJO对象等同于JavaBean对象,属于实体类的一种。
- 我们通过User对象来传递查询条件时,查询条件的范围有限,只能是User对象中有的数据。但在实际操作中,除了需要User对象的查询条件,还会需要其他对象的查询条件,此时使用User对象来传递查询条件显然是不够的。
- 通过POJO对象来传递查询条件的优势正在于此,将User对象以及所需的其他对象作为成员变量封装进POJO对象,在查询时,就可以使用多个对象的查询条件。
根据Query对象的条件,模糊查询
- QueryVo对象
- 将User对象封装进QueryVo对象中,并通过QueryVo对象来获取User对象中Username的值,用于进行模糊查询。
1 | package cn.water.domain; |
- 持久层接口
1 | List<User> findByQueryVO(QueryVo queryVo); |
- 映射配置文件
1 | <select id="findByQueryVo" parameterType="cn.water.domain.QueryVo" resultType="cn.water.domain.User"> |
执行过程(思维导图)
![](3.ProxyDao CRUD操作/ProxyDao CRUD操作 底层.png)